home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_03_05
/
3n05046a
< prev
next >
Wrap
Text File
|
1992-02-05
|
7KB
|
196 lines
;======================================================================
; DISKTYPE.ASM
; Copyright (c) 1992 Schaefer Software, Robert L. Hummel
;----------------------------------------------------------------------
; DisketteType() is a function that attempts to identify the type
; (capacity) of a diskette drive using BIOS calls. It returns an
; integer value that identifies the type of drive. Note that this
; routine operates on PHYSICAL diskette drives, not logical drives.
;
; To be properly identified, the drive must be supported by the BIOS of
; the PC. Improper information in the CMOS or incompatible hardware
; will tend to give incorrect results.
;----------------------------------------------------------------------
; Usage:
; Result = DisketteType(DriveNumber)
; where
; DriveNumber = (16-bit integer) physical drive number.
; 0 = 1st physical diskette
; 1 = 2nd physical diskette
; 2 = 3rd physical diskette
; etc.
;
; Result = (16-bit integer)
; 0, Drive not present or cannot identify
; 1, 360K 5.25" 40 track
; 2, 1.2M 5.25" 80 track
; 3, 720K 3.5" 80 track
; 4, 1.4M 3.5" 80 track
;----------------------------------------------------------------------
PUBLIC DisketteType ;BASIC, PASCAL (FAR)
PUBLIC _DisketteType ;C (FAR)
PUBLIC DisketteType$FAR ;ASM (FAR)
;======================================================================
; Code segment.
;----------------------------------------------------------------------
CSEG SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:CSEG
;======================================================================
; DisketteType$FAR
; Copyright (c) 1992 Schaefer Software, Robert L. Hummel
;
; The common assembly routine called by the HLL interface routines.
; May also be called directly from assembly language.
; All arguments are passed via register.
;----------------------------------------------------------------------
; Entry:
; DL = Physical drive number
; Exit:
; AX = Drive type
;----------------------------------------------------------------------
; Changes: AX BX CX DX ES
;----------------------------------------------------------------------
DisketteType$FAR PROC FAR
ASSUME CS:CSEG
PUSH SI ;Preserve registers
PUSH DI
;----------------------------------------------------------------------
; The Read Drive Parameters BIOS function is supported by all PCs
; except the PC, XT, PCjr, and first AT (BIOS 1/10/84). If successful,
; it returns the drive type in BL. Otherwise, CF is set.
;----------------------------------------------------------------------
MOV SI,DX ;Save drive number
MOV AH,8 ;Get disk type
;Drive number in DL
INT 13H ; thru BIOS
ASSUME ES:NOTHING ;May change ES
JNC DT_3A
;----------------------------------------------------------------------
; The carry flag was set, indicating that this function, and 3.5"
; drives, are not supported by this BIOS.
;
; All PCs that support the 1.2M drive support the Read DASD (Direct
; Access Storage Device) Type function call.
;----------------------------------------------------------------------
MOV AH,15H ;Read DASD type
MOV DX,SI ;For drive in DL
INT 13H ; thru BIOS
JNC DT_2
;----------------------------------------------------------------------
; The carry flag was set, so 1.2M drives are not supported. The only
; choices left are 360k 5.25" or not present. Check the equipment list
; to see if the drive number is within range.
;----------------------------------------------------------------------
MOV DX,SI ;Drive number in DL
INT 11H ;Get equipment list
MOV DH,AL ;Drives into DH
SUB AX,AX ;Assume not present
TEST DH,1 ;=1 if any drives
JZ DT_EXIT
ROL DH,1 ;Isolate
ROL DH,1 ; number of
AND DH,3 ; diskette drives
INC DH ; and make upper limit
CMP DL,DH ;CMP drive # to max
RCL AL,1 ;Move CF into AL
JMP SHORT DT_EXIT
;----------------------------------------------------------------------
; The Read DASD type call was successful. AH contains the BIOS return
; code for the drive type. If the drive supports the change line it is
; a 1.2M. Otherwise, it is a 360k.
;----------------------------------------------------------------------
DT_2:
SUB AL,AL ;Clear AL
XCHG AH,AL ;Put type in AX
JMP SHORT DT_EXIT
;----------------------------------------------------------------------
; If CX=0, then the specified drive is not installed. AX already
; contains a 0 (cleared by the BIOS function), so simply return.
;----------------------------------------------------------------------
DT_3A:
JCXZ DT_EXIT
;----------------------------------------------------------------------
; If BL=0, then the CMOS was corrupt. Determine the drive type by
; matching the returned drive parameters.
;----------------------------------------------------------------------
ADD AL,BL ;ZF=1 if BL=0
JNZ DT_EXIT
MOV AX,CX ;Save tracks/sectors
MOV CX,5 ;Preset return type
CMP AX,4F12H ;If type 4
LOOPE DT_3B ; DEC CX and exit
CMP AX,4F09H ;Type 3
LOOPE DT_3B
CMP AX,4F0FH ;Type 2
LOOPE DT_3B
CMP AX,2709H ;Type 1
LOOPE DT_3B
DT_3B:
MOV AX,CX
DT_EXIT:
POP DI
POP SI
RET
DisketteType$FAR ENDP
;======================================================================
; BASIC, PASCAL entry point.
;----------------------------------------------------------------------
; 1. Argument is passed by reference.
; 2. We clean up stack.
;----------------------------------------------------------------------
DisketteType PROC FAR
ASSUME CS:CSEG
PUSH BP ;Create stack frame
MOV BP,SP
MOV BX,WORD PTR [BP+6] ;Get pointer
MOV DX,WORD PTR [BX] ;Drive number
CALL DisketteType$FAR
POP BP ;Destroy stack frame
RET (1)*2 ;Discard 1 argument
DisketteType ENDP
;======================================================================
; C entry point.
;----------------------------------------------------------------------
; 1. Argument is passed by value.
; 2. Caller cleans up stack.
;----------------------------------------------------------------------
_DisketteType PROC FAR
ASSUME CS:CSEG
PUSH BP ;Create stack frame
MOV BP,SP
MOV DX,WORD PTR [BP+6] ;Get drive number
CALL DisketteType$FAR
POP BP ;Destroy stack frame
RET
_DisketteType ENDP
CSEG ENDS
END